TypeScript Enum์ ๊ฐ๋ ฅํ ๋์์ธ Const Assertion๊ณผ Union Type์ ํ๊ตฌํ์ธ์. ๊ฐ ๊ธฐ๋ฅ์ ์ธ์ ์ฌ์ฉํ์ฌ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ง ์์๋ณด์ธ์.
Enum์ ๋์ด์: TypeScript Const Assertion vs. Union Type
TypeScript์ ํจ๊ปํ๋ ์ ์ ํ์ JavaScript์ ์ธ๊ณ์์, enums๋ ์ค๋ซ๋์ ๊ณ ์ ๋ ๋ช ๋ช ๋ ์์๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋์ด ์์ต๋๋ค. Enums๋ ๊ด๋ จ๋ ๊ฐ๋ค์ ์ปฌ๋ ์ ์ ์ ์ํ๋ ๋ช ํํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํ๊ณ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๊ฐ๋ฐ์๋ค์ ์ข ์ข ๋ ์ ์ฐํ๊ณ ๋๋ก๋ ๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๋์์ ์ฐพ์ต๋๋ค. ์์ฃผ ๋ฑ์ฅํ๋ ๋ ๊ฐ์ง ๊ฐ๋ ฅํ ๋์์ const assertion๊ณผ union type์ ๋๋ค. ์ด ๊ฒ์๋ฌผ์ ์ ํต์ ์ธ enum์ ๋์์ ์ฌ์ฉํ๋ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ํ๊ณ ๋ค์ด, ์ค์ฉ์ ์ธ ์์๋ฅผ ์ ๊ณตํ๊ณ ์ธ์ ์ด๋ค ๊ฒ์ ์ ํํด์ผ ํ๋์ง์ ๋ํ ์ง์นจ์ ์ ์ํฉ๋๋ค.
์ ํต์ ์ธ TypeScript Enum ์ดํดํ๊ธฐ
๋์์ ํ์ํ๊ธฐ ์ ์, ํ์ค TypeScript enum์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ํ์คํ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. Enums๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ๋ช ๋ ์ซ์ ๋๋ ๋ฌธ์์ด ์์๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ซ์ํ์ด๊ฑฐ๋ ๋ฌธ์์ด ๊ธฐ๋ฐ์ผ ์ ์์ต๋๋ค.
์ซ์ Enum
๊ธฐ๋ณธ์ ์ผ๋ก enum ๋ฉค๋ฒ๋ 0๋ถํฐ ์์ํ๋ ์ซ์ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
enum DirectionNumeric {
Up,
Down,
Left,
Right
}
let myDirection: DirectionNumeric = DirectionNumeric.Up;
console.log(myDirection); // Output: 0
๋ช ์์ ์ผ๋ก ์ซ์ ๊ฐ์ ํ ๋นํ ์๋ ์์ต๋๋ค.
enum StatusCode {
Success = 200,
NotFound = 404,
InternalError = 500
}
let responseStatus: StatusCode = StatusCode.Success;
console.log(responseStatus); // Output: 200
๋ฌธ์์ด Enum
๋ฌธ์์ด enum์ ์ปดํ์ผ๋ JavaScript์์ ๋ฉค๋ฒ ์ด๋ฆ์ด ์ ์ง๋๋ฏ๋ก ํฅ์๋ ๋๋ฒ๊น ๊ฒฝํ์ ์ํด ์ข ์ข ์ ํธ๋ฉ๋๋ค.
enum ColorString {
Red = "RED",
Green = "GREEN",
Blue = "BLUE"
}
let favoriteColor: ColorString = ColorString.Blue;
console.log(favoriteColor); // Output: "BLUE"
Enum์ ์ค๋ฒํค๋
Enum์ ํธ๋ฆฌํ์ง๋ง ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. TypeScript enum์ JavaScript๋ก ์ปดํ์ผ๋ ๋ ์ข ์ข ์ญ๋งคํ(์: ์ซ์ ๊ฐ์ enum ์ด๋ฆ์ผ๋ก ๋ค์ ๋งคํ)์ ํฌํจํ๋ ๊ฐ์ฒด๋ก ๋ณํ๋ฉ๋๋ค. ์ด๊ฒ์ ์ ์ฉํ ์ ์์ง๋ง ๋ฒ๋ค ํฌ๊ธฐ์ ๊ธฐ์ฌํ๋ฉฐ ํญ์ ํ์ํ ๊ฒ์ ์๋ ์ ์์ต๋๋ค.
๋ค์ ๊ฐ๋จํ ๋ฌธ์์ด enum์ ๊ณ ๋ คํด ๋ณด์ธ์:
enum Status {
Pending = "PENDING",
Processing = "PROCESSING",
Completed = "COMPLETED"
}
JavaScript์์ ์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ ์ ์์ต๋๋ค:
var Status;
(function (Status) {
Status["Pending"] = "PENDING";
Status["Processing"] = "PROCESSING";
Status["Completed"] = "COMPLETED";
})(Status || (Status = {}));
๋จ์ํ๊ณ ์ฝ๊ธฐ ์ ์ฉ์ธ ์์ ์ธํธ์ ๊ฒฝ์ฐ, ์ด ์์ฑ๋ ์ฝ๋๋ ๋ค์ ๊ณผํ๋ค๊ณ ๋๊ปด์ง ์ ์์ต๋๋ค.
๋์ 1: Const Assertion
Const assertion์ ๊ฐ์ ๋ํด ๊ฐ๋ฅํ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ์ถ๋ก ํ๋๋ก ์ปดํ์ผ๋ฌ์ ์ง์ํ๋ ๊ฐ๋ ฅํ TypeScript ๊ธฐ๋ฅ์ ๋๋ค. ๊ณ ์ ๋ ๊ฐ ์ธํธ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด ๋๋ ๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉ๋ ๋, enum์ ๊ฒฝ๋ ๋์์ผ๋ก ์์ฉํ ์ ์์ต๋๋ค.
๋ฐฐ์ด๊ณผ ํจ๊ปํ๋ Const Assertion
๋ฌธ์์ด ๋ฆฌํฐ๋ด ๋ฐฐ์ด์ ์์ฑํ ๋ค์ const assertion์ ์ฌ์ฉํ์ฌ ํด๋น ํ์
์ ๋ถ๋ณ์ผ๋ก ๋ง๋ค๊ณ ์์๋ค์ ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
const statusArray = ["PENDING", "PROCESSING", "COMPLETED"] as const;
type StatusType = typeof statusArray[number];
let currentStatus: StatusType = "PROCESSING";
// currentStatus = "FAILED"; // Error: Type '"FAILED"' is not assignable to type 'StatusType'.
function processStatus(status: StatusType) {
console.log(`Processing status: ${status}`);
}
processStatus("COMPLETED");
์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ดํด๋ด ์๋ค:
as const: ์ด assertion์ TypeScript์๊ฒ ๋ฐฐ์ด์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ทจ๊ธํ๊ณ ๊ทธ ์์๋ค์ ๋ํด ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ๋ฆฌํฐ๋ด ํ์ ์ ์ถ๋ก ํ๋๋ก ์ง์ํฉ๋๋ค. ๋ฐ๋ผ์ `string[]` ๋์ ํ์ ์ `readonly ["PENDING", "PROCESSING", "COMPLETED"]`๊ฐ ๋ฉ๋๋ค.typeof statusArray[number]: ์ด๊ฒ์ ๋งคํ๋ ํ์ ์ ๋๋ค. `statusArray`์ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ณตํ๊ณ ํด๋น ๋ฆฌํฐ๋ด ํ์ ์ ์ถ์ถํฉ๋๋ค. `number` ์ธ๋ฑ์ค ์๊ทธ๋์ฒ๋ ๋ณธ์ง์ ์ผ๋ก "์ด ๋ฐฐ์ด์ ๋ชจ๋ ์์์ ํ์ ์ ์๋ ค์ค"๋ผ๊ณ ๋งํฉ๋๋ค. ๊ฒฐ๊ณผ๋ union type:"PENDING" | "PROCESSING" | "COMPLETED"์ ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์์ด enum๊ณผ ์ ์ฌํ ํ์ ์์ ์ฑ์ ์ ๊ณตํ์ง๋ง ์ต์ํ์ JavaScript๋ฅผ ์์ฑํฉ๋๋ค. `statusArray` ์์ฒด๋ JavaScript์์ ๋ฌธ์์ด ๋ฐฐ์ด๋ก ์ ์ง๋ฉ๋๋ค.
๊ฐ์ฒด์ ํจ๊ปํ๋ Const Assertion
Const assertion์ ๊ฐ์ฒด์ ์ ์ฉ๋ ๋ ํจ์ฌ ๋ ๊ฐ๋ ฅํฉ๋๋ค. ํค๊ฐ ๋ช ๋ช ๋ ์์๋ฅผ ๋ํ๋ด๊ณ ๊ฐ์ด ๋ฆฌํฐ๋ด ๋ฌธ์์ด ๋๋ ์ซ์์ธ ๊ฐ์ฒด๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
const userRoles = {
Admin: "ADMIN",
Editor: "EDITOR",
Viewer: "VIEWER"
} as const;
type UserRole = typeof userRoles[keyof typeof userRoles];
let currentUserRole: UserRole = "EDITOR";
// currentUserRole = "GUEST"; // Error: Type '"GUEST"' is not assignable to type 'UserRole'.
function displayRole(role: UserRole) {
console.log(`User role is: ${role}`);
}
displayRole(userRoles.Admin); // Valid
displayRole("EDITOR"); // Valid
์ด ๊ฐ์ฒด ์์์์:
as const: ์ด assertion์ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ญ๋๋ค. ๋ ์ค์ํ ๊ฒ์ ๋ชจ๋ ์์ฑ ๊ฐ์ ๋ํด ๋ฆฌํฐ๋ด ํ์ ์ ์ถ๋ก ํ๊ณ (์: `string` ๋์ `"ADMIN"`) ์์ฑ ์์ฒด๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ค.keyof typeof userRoles: ์ด ํํ์์ `userRoles` ๊ฐ์ฒด์ ํค๋ค์ union, ์ฆ"Admin" | "Editor" | "Viewer"๋ฅผ ๋ฐํํฉ๋๋ค.typeof userRoles[keyof typeof userRoles]: ์ด๊ฒ์ ๋ฃฉ์ ํ์ ์ ๋๋ค. ํค๋ค์ union์ ์ทจํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ `userRoles` ํ์ ์์ ํด๋น ๊ฐ์ ์ฐพ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค์ union:"ADMIN" | "EDITOR" | "VIEWER"์ด๋ฉฐ, ์ด๋ ์ญํ ์ ๋ํด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํ์ ์ ๋๋ค.
userRoles์ ๋ํ JavaScript ์ถ๋ ฅ์ ์ผ๋ฐ JavaScript ๊ฐ์ฒด๊ฐ ๋ฉ๋๋ค:
var userRoles = {
Admin: "ADMIN",
Editor: "EDITOR",
Viewer: "VIEWER"
};
์ด๊ฒ์ ์ผ๋ฐ์ ์ธ enum๋ณด๋ค ํจ์ฌ ๊ฐ๋ณ์ต๋๋ค.
Const Assertion์ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
- ์ฝ๊ธฐ ์ ์ฉ ์์: ๋ฐํ์์ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ๋ ๊ณ ์ ๋ ๋ฌธ์์ด ๋๋ ์ซ์ ๋ฆฌํฐ๋ด ์ธํธ๊ฐ ํ์ํ ๋.
- ์ต์ํ์ JavaScript ์ถ๋ ฅ: ๋ฒ๋ค ํฌ๊ธฐ์ ๊ด์ฌ์ด ์๊ณ ์์์ ๋ํด ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์ ๋ฐํ์ ํํ์ ์ํ ๋.
- ๊ฐ์ฒด์ ์ ์ฌํ ๊ตฌ์กฐ: ๋ฐ์ดํฐ ๋๋ ๊ตฌ์ฑ์ ๊ตฌ์ฑํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ํค-๊ฐ ์์ ๊ฐ๋ ์ฑ์ ์ ํธํ ๋.
- ๋ฌธ์์ด ๊ธฐ๋ฐ ์ธํธ: ์ค๋ช ์ ์ธ ๋ฌธ์์ด๋ก ๊ฐ์ฅ ์ ์๋ณ๋๋ ์ํ, ํ์ ๋๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ํ๋ด๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
๋์ 2: Union Type
Union type์ ๋ณ์๊ฐ ์ฌ๋ฌ ํ์ ์ค ํ๋์ ๊ฐ์ ๊ฐ์ง ์ ์๋ค๊ณ ์ ์ธํ ์ ์๊ฒ ํฉ๋๋ค. ๋ฆฌํฐ๋ด ํ์ (๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ ๋ฆฌํฐ๋ด)๊ณผ ๊ฒฐํฉ๋ ๋, ์ธํธ ์์ฒด์ ๋ํ ๋ช ์์ ์ธ ์์ ์ ์ธ ์์ด ํ์ฉ๋๋ ๊ฐ๋ค์ ์ธํธ๋ฅผ ์ ์ํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ํ์ฑํฉ๋๋ค.
๋ฌธ์์ด ๋ฆฌํฐ๋ด๊ณผ ํจ๊ปํ๋ Union Type
๋ฌธ์์ด ๋ฆฌํฐ๋ด์ union์ ์ง์ ์ ์ํ ์ ์์ต๋๋ค.
type TrafficLightColor = "RED" | "YELLOW" | "GREEN";
let currentLight: TrafficLightColor = "YELLOW";
// currentLight = "BLUE"; // Error: Type '"BLUE"' is not assignable to type 'TrafficLightColor'.
function changeLight(color: TrafficLightColor) {
console.log(`Changing light to: ${color}`);
}
changeLight("RED");
// changeLight("REDDY"); // Error
์ด๊ฒ์ ํ์ฉ๋๋ ๋ฌธ์์ด ๊ฐ์ ์ธํธ๋ฅผ ์ ์ํ๋ ๊ฐ์ฅ ์ง์ ์ ์ด๊ณ ์ข ์ข ๊ฐ์ฅ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ ๋๋ค.
์ซ์ ๋ฆฌํฐ๋ด๊ณผ ํจ๊ปํ๋ Union Type
๋ง์ฐฌ๊ฐ์ง๋ก ์ซ์ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
type HttpStatusCode = 200 | 400 | 404 | 500;
let responseCode: HttpStatusCode = 404;
// responseCode = 201; // Error: Type '201' is not assignable to type 'HttpStatusCode'.
function handleResponse(code: HttpStatusCode) {
if (code === 200) {
console.log("Success!");
} else {
console.log(`Error code: ${code}`);
}
}
handleResponse(500);
Union Type์ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
- ๋จ์ํ๊ณ ์ง์ ์ ์ธ ์ธํธ: ํ์ฉ๋๋ ๊ฐ์ ์ธํธ๊ฐ ์๊ณ ๋ช ํํ๋ฉฐ, ๊ฐ ์์ฒด๋ฅผ ๋์ด์ ์ค๋ช ์ ์ธ ํค๊ฐ ํ์ํ์ง ์์ ๋.
- ์์์ ์์: ์ธํธ ์์ฒด์ ๋ํ ๋ช ๋ช ๋ ์์๋ฅผ ์ฐธ์กฐํ ํ์๊ฐ ์๊ณ , ๋์ ๋ฆฌํฐ๋ด ๊ฐ์ ์ง์ ์ฌ์ฉํ ๋.
- ์ต๋ ๊ฐ๊ฒฐ์ฑ: ์ ์ฉ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ์ ์ํ๋ ๊ฒ์ด ๊ณผํ๋ค๊ณ ๋๊ปด์ง๋ ๊ฐ๋จํ ์๋๋ฆฌ์ค์.
- ํจ์ ๋งค๊ฐ๋ณ์/๋ฐํ ํ์ : ํจ์์ ๋ํ ํ์ฉ ๊ฐ๋ฅํ ๋ฌธ์์ด ๋๋ ์ซ์ ์ ๋ ฅ/์ถ๋ ฅ์ ์ ํํ ์ธํธ๋ฅผ ์ ์ํ๋ ๋ฐ ํ์ํฉ๋๋ค.
Enum, Const Assertion, Union Type ๋น๊ต
์ฃผ์ ์ฐจ์ด์ ๊ณผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์์ฝํด ๋ด ์๋ค:
๋ฐํ์ ๋์
- Enums: JavaScript ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉฐ, ์ญ๋งคํ์ ํฌํจํ ์ ์์ต๋๋ค.
- Const Assertion (๋ฐฐ์ด/๊ฐ์ฒด): ์ผ๋ฐ JavaScript ๋ฐฐ์ด ๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ํ์ ์ ๋ณด๋ ๋ฐํ์์ ์ง์์ง์ง๋ง, ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ ์ง๋ฉ๋๋ค.
- Union Type (๋ฆฌํฐ๋ด ํฌํจ): Union ์์ฒด์ ๋ํ ๋ฐํ์ ํํ์ด ์์ต๋๋ค. ๊ฐ์ ๋จ์ํ ๋ฆฌํฐ๋ด์ ๋๋ค. ํ์ ๊ฒ์ฌ๋ ์ปดํ์ผ ํ์์๋ง ๋ฐ์ํฉ๋๋ค.
๊ฐ๋ ์ฑ๊ณผ ํํ๋ ฅ
- Enums: ํนํ ์ค๋ช ์ ์ธ ์ด๋ฆ๊ณผ ํจ๊ป ๋์ ๊ฐ๋ ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ ์ฅํฉํ ์ ์์ต๋๋ค.
- Const Assertion (๊ฐ์ฒด): ๊ตฌ์ฑ ๋๋ ์ค์ ๋ฐฉ์์ ๋ชจ๋ฐฉํ๋ ํค-๊ฐ ์์ ํตํด ์ข์ ๊ฐ๋ ์ฑ์ ์ ๊ณตํฉ๋๋ค.
- Const Assertion (๋ฐฐ์ด): ๋ช ๋ช ๋ ์์๋ฅผ ๋ํ๋ด๋ ๋ฐ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ฉฐ, ์ฃผ๋ก ์ ๋ ฌ๋ ๊ฐ ๋ชฉ๋ก์ ์ฌ์ฉ๋ฉ๋๋ค.
- Union Type: ๋งค์ฐ ๊ฐ๊ฒฐํฉ๋๋ค. ๊ฐ๋ ์ฑ์ ๋ฆฌํฐ๋ด ๊ฐ ์์ฒด์ ๋ช ํ์ฑ์ ๋ฌ๋ ค ์์ต๋๋ค.
ํ์ ์์ ์ฑ
- ์ธ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋ ๊ฐ๋ ฅํ ํ์ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ณ์์ ํ ๋น๋๊ฑฐ๋ ํจ์์ ์ ๋ฌ๋ ์ ์๋ ๊ฐ์ด ์ ํจํ๊ณ ๋ฏธ๋ฆฌ ์ ์๋ ๊ฐ์ผ๋ก๋ง ์ ํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ฒ๋ค ํฌ๊ธฐ
- Enums: ์์ฑ๋ JavaScript ๊ฐ์ฒด๋ก ์ธํด ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ํฝ๋๋ค.
- Const Assertions: ์ผ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ฏ๋ก enum๋ณด๋ค ์์ต๋๋ค.
- Union Types: ํ์ ์์ฒด์ ๋ํ ํน์ ๋ฐํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฑํ์ง ์๊ณ ๋ฆฌํฐ๋ด ๊ฐ์๋ง ์์กดํ๋ฏ๋ก ๊ฐ์ฅ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ๋งคํธ๋ฆญ์ค
๊ฐ๋จํ ๊ฐ์ด๋์ ๋๋ค:
| ๊ธฐ๋ฅ | TypeScript Enum | Const Assertion (๊ฐ์ฒด) | Const Assertion (๋ฐฐ์ด) | Union Type (๋ฆฌํฐ๋ด) |
|---|---|---|---|---|
| ๋ฐํ์ ์ถ๋ ฅ | JS ๊ฐ์ฒด (์ญ๋งคํ ํฌํจ) | ์ผ๋ฐ JS ๊ฐ์ฒด | ์ผ๋ฐ JS ๋ฐฐ์ด | ์์ (๋ฆฌํฐ๋ด ๊ฐ๋ง) |
| ๊ฐ๋ ์ฑ (๋ช ๋ช ๋ ์์) | ๋์ | ๋์ | ์ค๊ฐ | ๋ฎ์ (๊ฐ ์์ฒด๊ฐ ์ด๋ฆ) |
| ๋ฒ๋ค ํฌ๊ธฐ | ๊ฐ์ฅ ํผ | ์ค๊ฐ | ์ค๊ฐ | ๊ฐ์ฅ ์์ |
| ์ ์ฐ์ฑ | ์ข์ | ์ข์ | ์ข์ | ํ์ํจ (๋จ์ํ ์ธํธ์) |
| ์ผ๋ฐ์ ์ธ ์ฌ์ฉ | ์ํ, ์ํ ์ฝ๋, ์นดํ ๊ณ ๋ฆฌ | ๊ตฌ์ฑ, ์ญํ ์ ์, ๊ธฐ๋ฅ ํ๋๊ทธ | ๋ถ๋ณ ๊ฐ์ ์ ๋ ฌ๋ ๋ชฉ๋ก | ํจ์ ๋งค๊ฐ๋ณ์, ๋จ์ ์ ํ ๊ฐ |
์ค์ฉ์ ์ธ ์์์ ๋ชจ๋ฒ ์ฌ๋ก
์์ 1: API ์ํ ์ฝ๋ ํํํ๊ธฐ
Enum:
enum ApiStatus {
Success = "SUCCESS",
Error = "ERROR",
Pending = "PENDING"
}
function handleApiResponse(status: ApiStatus) {
// ... logic ...
}
Const Assertion (๊ฐ์ฒด):
const apiStatusCodes = {
SUCCESS: "SUCCESS",
ERROR: "ERROR",
PENDING: "PENDING"
} as const;
type ApiStatus = typeof apiStatusCodes[keyof typeof apiStatusCodes];
function handleApiResponse(status: ApiStatus) {
// ... logic ...
}
Union Type:
type ApiStatus = "SUCCESS" | "ERROR" | "PENDING";
function handleApiResponse(status: ApiStatus) {
// ... logic ...
}
๊ถ์ฅ ์ฌํญ: ์ด ์๋๋ฆฌ์ค์์๋ union type์ด ์ข ์ข ๊ฐ์ฅ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ ๋๋ค. ๋ฆฌํฐ๋ด ๊ฐ ์์ฒด๊ฐ ์ถฉ๋ถํ ์ค๋ช ์ ์ ๋๋ค. ๊ฐ ์ํ์ ์ถ๊ฐ ๋ฉํ๋ฐ์ดํฐ(์: ์ฌ์ฉ์ ์นํ์ ์ธ ๋ฉ์์ง)๋ฅผ ์ฐ๊ฒฐํด์ผ ํ๋ ๊ฒฝ์ฐ, const assertion ๊ฐ์ฒด๊ฐ ๋ ๋์ ์ ํ์ผ ๊ฒ์ ๋๋ค.
์์ 2: ์ฌ์ฉ์ ์ญํ ์ ์ํ๊ธฐ
Enum:
enum UserRoleEnum {
Admin = "ADMIN",
Moderator = "MODERATOR",
User = "USER"
}
function getUserPermissions(role: UserRoleEnum) {
// ... logic ...
}
Const Assertion (๊ฐ์ฒด):
const userRolesObject = {
Admin: "ADMIN",
Moderator: "MODERATOR",
User: "USER"
} as const;
type UserRole = typeof userRolesObject[keyof typeof userRolesObject];
function getUserPermissions(role: UserRole) {
// ... logic ...
}
Union Type:
type UserRole = "ADMIN" | "MODERATOR" | "USER";
function getUserPermissions(role: UserRole) {
// ... logic ...
}
๊ถ์ฅ ์ฌํญ: const assertion ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ์ ์ข์ ๊ท ํ์ ์ด๋ฃน๋๋ค. ๋ช
ํํ ํค-๊ฐ ์(์: userRolesObject.Admin)์ ์ ๊ณตํ์ฌ ์ญํ ์ ์ฐธ์กฐํ ๋ ๊ฐ๋
์ฑ์ ํฅ์์ํค๋ฉด์๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋ฉ๋๋ค. ์ง์ ์ ์ธ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก ์ถฉ๋ถํ๋ค๋ฉด union type๋ ๋งค์ฐ ๊ฐ๋ ฅํ ๋์์
๋๋ค.
์์ 3: ๊ตฌ์ฑ ์ต์ ํํํ๊ธฐ
์ ์ญ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ํ ๋ง๋ฅผ ๊ฐ์ง ์ ์๋ ๊ตฌ์ฑ ๊ฐ์ฒด๋ฅผ ์์ํด ๋ณด์ธ์.
Enum:
enum Theme {
Light = "light",
Dark = "dark",
System = "system"
}
interface AppConfig {
theme: Theme;
// ... other config options ...
}
Const Assertion (๊ฐ์ฒด):
const themes = {
Light: "light",
Dark: "dark",
System: "system"
} as const;
type Theme = typeof themes[keyof typeof themes];
interface AppConfig {
theme: Theme;
// ... other config options ...
}
Union Type:
type Theme = "light" | "dark" | "system";
interface AppConfig {
theme: Theme;
// ... other config options ...
}
๊ถ์ฅ ์ฌํญ: ํ
๋ง์ ๊ฐ์ ๊ตฌ์ฑ ์ค์ ์ ๊ฒฝ์ฐ const assertion ๊ฐ์ฒด๊ฐ ์ข
์ข
์ด์์ ์
๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ์ต์
๊ณผ ํด๋น ๋ฌธ์์ด ๊ฐ์ ๋ช
ํํ๊ฒ ์ ์ํฉ๋๋ค. ํค(Light, Dark, System)๋ ์ค๋ช
์ ์ด๋ฉฐ ๊ฐ์ ์ง์ ๋งคํ๋์ด ๊ตฌ์ฑ ์ฝ๋๋ฅผ ๋งค์ฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์ฌ๋ฐ๋ฅธ ๋๊ตฌ ์ ํํ๊ธฐ
TypeScript enum, const assertion, union type ์ฌ์ด์ ๊ฒฐ์ ์ ํญ์ ๋ช ํํ์ง๋ ์์ต๋๋ค. ์ด๋ ์ข ์ข ๋ฐํ์ ์ฑ๋ฅ, ๋ฒ๋ค ํฌ๊ธฐ, ์ฝ๋ ๊ฐ๋ ์ฑ/ํํ๋ ฅ ์ฌ์ด์ ์ ์ถฉ์์ผ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค.
- ๊ฐ๋จํ๊ณ ์ ํ๋ ๋ฌธ์์ด ๋๋ ์ซ์ ๋ฆฌํฐ๋ด ์ธํธ๊ฐ ํ์ํ๊ณ ์ต๋ ๊ฐ๊ฒฐ์ฑ์ด ์๊ตฌ๋ ๋ Union Type์ ์ ํํ์ธ์. ํจ์ ์๊ทธ๋์ฒ ๋ฐ ๊ธฐ๋ณธ ๊ฐ ์ ํ์ ํ์ํฉ๋๋ค.
- enum๊ณผ ์ ์ฌํ๊ฒ ๋ช ๋ช ๋ ์์๋ฅผ ์ ์ํ๋ ๋ฐ ๋ ๊ตฌ์กฐ์ ์ด๊ณ ์ฝ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ํ์ง๋ง ๋ฐํ์ ์ค๋ฒํค๋๊ฐ ํจ์ฌ ์ ์ ๋ Const Assertion (๊ฐ์ฒด์ ํจ๊ป)์ ์ ํํ์ธ์. ์ด๋ ๊ตฌ์ฑ, ์ญํ ๋๋ ํค๊ฐ ์ค์ํ ์๋ฏธ๋ฅผ ์ถ๊ฐํ๋ ๋ชจ๋ ์ธํธ์ ์ ํฉํฉ๋๋ค.
- ๋จ์ํ ๋ถ๋ณ์ ์ ๋ ฌ๋ ๊ฐ ๋ชฉ๋ก์ด ํ์ํ๊ณ ๋ช ๋ช ๋ ํค๋ณด๋ค ์ธ๋ฑ์ค๋ฅผ ํตํ ์ง์ ์ก์ธ์ค๊ฐ ๋ ์ค์ํ ๋ Const Assertion (๋ฐฐ์ด๊ณผ ํจ๊ป)์ ์ ํํ์ธ์.
- ์ญ๋งคํ๊ณผ ๊ฐ์ ํน์ ๊ธฐ๋ฅ์ด ํ์ํ๊ฑฐ๋ (ํ๋ ๊ฐ๋ฐ์์๋ ๋ ํํ์ง๋ง) ํ์ ๊ฐ๋ ฅํ ์ ํธ๋๊ฐ ์๊ณ ํ๋ก์ ํธ์ ๋ํ ์ฑ๋ฅ ์ํฅ์ด ๋ฌด์ํ ์ ์๋ ๊ฒฝ์ฐ TypeScript Enum์ ๊ณ ๋ คํ์ธ์.
๋ง์ ์ต์ TypeScript ํ๋ก์ ํธ์์๋ ํนํ ๋ฌธ์์ด ๊ธฐ๋ฐ ์์์ ๋ํด ๋ ๋์ ์ฑ๋ฅ ํน์ฑ๊ณผ ์ข ์ข ๋ ๊ฐ๋จํ JavaScript ์ถ๋ ฅ์ผ๋ก ์ธํด ์ ํต์ ์ธ enum๋ณด๋ค const assertion๊ณผ union type์ ์ ํธํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ ์ญ์ ๊ณ ๋ ค ์ฌํญ
์ ์ธ๊ณ ์ฌ์ฉ์๋ค์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ์ผ๊ด๋๊ณ ์์ธก ๊ฐ๋ฅํ ์์ ์ ์๊ฐ ์ค์ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ ผ์ํ ์ ํ ์ฌํญ(enum, const assertion, union type)์ ๋ชจ๋ ์๋ก ๋ค๋ฅธ ํ๊ฒฝ๊ณผ ๊ฐ๋ฐ์ ๋ก์ผ์ผ์์ ํ์ ์์ ์ฑ์ ๊ฐ์ ํจ์ผ๋ก์จ ์ด๋ฌํ ์ผ๊ด์ฑ์ ๊ธฐ์ฌํฉ๋๋ค.
- ์ผ๊ด์ฑ: ์ ํํ ๋ฐฉ๋ฒ์ ๊ด๊ณ์์ด ํ๋ก์ ํธ ๋ด์์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ญํ ์ const assertion ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด, ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์์ ํด๋น ํจํด์ ๊ณ ์ํ์ธ์.
- ๊ตญ์ ํ (i18n): ๊ตญ์ ํ๋ ๋ ์ด๋ธ์ด๋ ๋ฉ์์ง๋ฅผ ์ ์ํ ๋, ์ ํจํ ํค ๋๋ ์๋ณ์๋ง ์ฌ์ฉ๋๋๋ก ์ด๋ฌํ ํ์ ์์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ธ์. ์ค์ ๋ฒ์ญ๋ ๋ฌธ์์ด์ i18n ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๋ณ๋๋ก ๊ด๋ฆฌ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, "PENDING", "PROCESSING", "COMPLETED"๊ฐ ๋ ์ ์๋ `status` ํ๋๊ฐ ์๋ค๋ฉด, i18n ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฌํ ๋ด๋ถ ์๋ณ์๋ฅผ ์ง์ญํ๋ ํ์ ํ ์คํธ์ ๋งคํํ ๊ฒ์ ๋๋ค.
- ์๊ฐ๋ ๋ฐ ํตํ: enum๊ณผ ์ง์ ์ ์ผ๋ก ๊ด๋ จ์ด ์์ง๋ง, ๋ ์ง, ์๊ฐ ๋๋ ํตํ์ ๊ฐ์ ๊ฐ์ ๋ค๋ฃฐ ๋ TypeScript์ ํ์
์์คํ
์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋์ง๋ง, ์ ํํ ์ ์ญ ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, `Currency` union type์
"USD" | "EUR" | "GBP"๋ก ์ ์๋ ์ ์์ง๋ง, ์ค์ ๋ณํ ๋ก์ง์๋ ์ ๋ฌธํ๋ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค.
๊ฒฐ๋ก
TypeScript๋ ์์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ๋ถํ ๋๊ตฌ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. enum์ด ์ฐ๋ฆฌ์๊ฒ ์ ๋ด์ฌํด ์์ง๋ง, const assertion๊ณผ union type์ ์ข ์ข ๋ ์ฑ๋ฅ์ด ์ข์ ๋งค๋ ฅ์ ์ธ ๋์์ ์ ๊ณตํฉ๋๋ค. ์ฑ๋ฅ, ๊ฐ๋ ์ฑ ๋๋ ๊ฐ๊ฒฐ์ฑ๊ณผ ๊ฐ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์ด๋ค์ ์ฐจ์ด์ ์ ์ดํดํ๊ณ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ํํจ์ผ๋ก์จ, ์ ์ธ๊ณ์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅํ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ํจ์จ์ ์ธ TypeScript ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋์์ ์์ฉํ๋ฉด ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ค์ด๋ค๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์๋๊ฐ ๋นจ๋ผ์ง๋ฉฐ, ๊ตญ์ ํ์ ๋ํ ๋ ์์ธก ๊ฐ๋ฅํ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.